/*
# MIAHX© 框架消息的 FastDDS 订阅器（C++实现）

Version: 0.4.10,
Last updated: October 16, 2024

## Contributor(s)
* YAO Naiming <[naiming@iscas.ac.cn](mailto:naiming@iscas.ac.cn)>

## Change log
### v0.4.10
- .16: [更新] 新增注释
- .15: [更新] 版本同步至 Python 版v0.4.10.14
### v0.4.7
- .26: [新增] 初始实现

---
Copyright © 2024-2025 MIAHX Contributors, ISCAS, and ASIC. All Rights Reserved.
Licensed under Apache-2.0.
*/

#pragma once

#include "participant.h"


/**
 * @brief 数据监听器函数类型
 */
typedef function<void(void *)> data_listener;


/**
 * @brief 表示数据读取器的监听器
 */
class ReaderListener : public DataReaderListener {
public:
    /**
     * @brief 构造方法
     *
     * @param topic_data_type 主题数据类型
     * @param on_data_listener 数据监听回调函数
     * @param user_state 用户自定义数据
     */
    explicit ReaderListener(TopicDataType *topic_data_type, data_listener &on_data_listener, void *user_state);

    /**
     * 析构函数
     */
    ~ReaderListener() override;

protected:
    void on_data_available(DataReader *reader) override;

    void on_subscription_matched(DataReader *reader, const SubscriptionMatchedStatus &info) override;

public:
    data_listener mOnDataListener;

protected:
    TopicDataType *mTopicDataType;
    void *mUserState;
};


/**
 * 数据读取器基类
 */
class Reader {
public:
    /**
     * @brief 构造函数
     *
     * @param participant FastDDS 参与者接口
     * @param topic_name 主题名称
     * @param topic_data_type 主题数据类型
     * @param listener 数据读取器的监听器对象
     */
    MIAHX_WRAPPER_API
    explicit Reader(Participant *participant, const string &topic_name,
                                  TopicDataType *topic_data_type, DataReaderListener *listener = nullptr);

    /**
     * @brief 析构函数
     */
    MIAHX_WRAPPER_API
    ~Reader();

    /**
     * @brief 挂起当前对象并等待终止
     *
     * @param mutex 互斥体
     * @param cond 条件变量
     */
    MIAHX_WRAPPER_API
    void wait(unique_lock<mutex> &mutex, condition_variable &cond);

public:
    string topic_name;

private:
    Subscriber *mSubscriber;
    DataReader *mReader;
};
